package com.luoy.netty.echo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

import java.nio.charset.Charset;

/**
 * 自己的业务处理
 * @author LUOYUAN
 * @create 2019-07-08-14:24
 */
@ChannelHandler.Sharable //指明此类可以在多个channel之间共享，意味这个实现必须线程安全
public class EchoServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 服务器端读取到网络数据后处理
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //netty实现的缓冲区
        ByteBuf in = (ByteBuf) msg;
        System.out.println("server accept："+in.toString(CharsetUtil.UTF_8));
        ChannelFuture sync = ctx.write(in).sync();
        //  ReferenceCountUtil.release(msg);
    }

    /**
     * 服务端读取完成网络数据后的处理
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
//        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER) //flush所有数据
//                .addListener(ChannelFutureListener.CLOSE); //flush以后，关闭连接

        ChannelFuture wangqiong = ctx.writeAndFlush(Unpooled.copiedBuffer("wangqiong", CharsetUtil.UTF_8)).sync();
    }

    /**
     * 发生异常后处理
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();

    }
}
